package org.compiere.report;

import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;

import org.adempiere.exceptions.AdempiereException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.compiere.model.I_CMS_Contract;
import org.compiere.model.MAttachmentEntry;
import org.compiere.model.MBank;
import org.compiere.model.MBankAccount;
import org.compiere.model.MCMSContract;
import org.compiere.model.MTRMDeposit;
import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoParameter;
import org.compiere.process.SvrProcess;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;

import extend.org.compiere.utils.Util;

/**
 * 07.01.2014 @author Aslanbek
 */
public class TRM_DepositReportNew extends SvrProcess {
	private Properties m_ctx;
	private ProcessInfo pi;
	private Timestamp BeginPeriod;
	private Timestamp EndPeriod;
	private boolean isThousand = false;
	private boolean addComment = true;
	/**Out file */
	String ResultPath;
	protected void prepare() {
		m_ctx = Env.getCtx();
		pi = getProcessInfo();
		ProcessInfoParameter[] para = getParameter();
		
		for(int i = 0; i < para.length; i++) 
		{
			String name = para[i].getParameterName();			
			
			if (para[i].getParameter() == null)
				;
			else if (name.equals("BeginPeriod"))
				BeginPeriod = (Timestamp)para[i].getParameter();
			else if (name.equals("EndPeriod"))
				EndPeriod = (Timestamp)para[i].getParameter();
			else if(name.equals("isThousand"))
				isThousand = para[i].getParameterAsBoolean();
			else if(name.equals("AddComment"))
				addComment = para[i].getParameterAsBoolean();
			else
			{
				log.log(Level.SEVERE, "Unknown Parameter: " + name);
			}				
		}

	}

	protected String doIt() throws Exception {
		//File path
		String p_SQl = "SELECT erps_periodrange("+DB.TO_DATE(BeginPeriod, true)
				+","+DB.TO_DATE(EndPeriod, true)+") WHERE 1=?";
		String periodName = DB.getSQLValueString(get_TrxName(), p_SQl, 1);
		ResultPath = Util.getResultPath("ВСДС за "+periodName+(isThousand?" в тыс тенге":"")
				, (new String("ВСДС за "+periodName+(isThousand?" в тыс тенге":"")).length())+1);
		// 
		  MAttachmentEntry entry = Util. getAttachment(pi, m_ctx, ResultPath);
		if (entry == null)
			throw new AdempiereException(Msg.translate(m_ctx,"NotFoundTemplate"));
		
		XSSFWorkbook wb = new XSSFWorkbook(entry.getInputStream());
		wb.setSheetName(0, "ВСДС за "+periodName);
		XSSFSheet sheet = wb.getSheetAt(0);
		Row R = null;
		Cell C = null;
		int rowNo = 0;
		int nn = 0;
		int startRowNo = 2;
		//Cell styles
		R = sheet.getRow(rowNo);
		CellStyle csBText = R.getCell(19).getCellStyle();
		CellStyle csText = R.getCell(20).getCellStyle();
		CellStyle csPercent = R.getCell(21).getCellStyle();
		CellStyle csBPercent = R.getCell(22).getCellStyle();
		CellStyle csBNumberTh = R.getCell(23).getCellStyle();
		CellStyle csNumberTh = R.getCell(24).getCellStyle();
		CellStyle csBNumber = R.getCell(25).getCellStyle();
		CellStyle csNumber = R.getCell(26).getCellStyle();
		CellStyle csDate = R.getCell(27).getCellStyle();

		int totalRowNo = startRowNo;
		rowNo = 3;
		nn = 1;
		
		String whereClause = " Deposits='Y' AND A_Expired_Date >'"+EndPeriod+"' AND DateFrom <= '"+BeginPeriod+"'";

		int[] contracts = MCMSContract.getAllIDs(I_CMS_Contract.Table_Name, whereClause, get_TrxName());
				
		totalRowNo = totalRowNo + 1 + contracts.length;
		
		BigDecimal currBankAccTotalBeginSum = Env.ZERO; //Общоя сумма расчетных счетов на нач периода
		BigDecimal currBankAccTotalTurnoverSum = Env.ZERO; //Общая сумма расчетных счетов обороты за период
		Line[] currBankAccLines = getLines("C", BeginPeriod, EndPeriod); //Список расчетных счетов
		totalRowNo = totalRowNo + 1 + currBankAccLines.length;
		for(Line line:currBankAccLines)
		{
			currBankAccTotalBeginSum = currBankAccTotalBeginSum.add(line.getBeginSaldo());
			currBankAccTotalTurnoverSum = currBankAccTotalTurnoverSum.add(line.getTurnover());
		}

//Депозиты----------------------------------------------------------------------------------------------
		MCMSContract lineC = null;
		MTRMDeposit lineD = null;
		for(int contract_ID : contracts)
		{
			lineC = new MCMSContract(m_ctx, contract_ID, get_TrxName());
			MTRMDeposit[] deposit = MTRMDeposit.getOfCMS_Contract(m_ctx, lineC.getCMS_Contract_ID(), get_TrxName());
			if(deposit.length>0)
				lineD = deposit[0];
			else
			{
				deposit = MTRMDeposit.getOfCMS_Contract(m_ctx, lineC.getCMS_Contract_Parent_ID(), get_TrxName());
				if(deposit.length>0)
					lineD = deposit[0];
			}
			
			if(deposit.length>0)
			{
				R = sheet.createRow(rowNo);
				//col0 №
				C = R.createCell(0);
				C.setCellValue(nn);
				C.setCellStyle(csText);
				//col1 Банк
				C = R.createCell(1);
				C.setCellValue(new MBank(m_ctx, lineD.getC_Bank_ID(), get_TrxName()).getName());
				//Добавление примечании на ячейку
				if(addComment)
					addComment(C, lineD.getC_BankAccount().getAccountNo()+"\n"
								+lineC.getCMS_Contract_ContractNum()+"\n"
								+(lineC.getDescription()==null?"Описание отсутсвует":lineC.getDescription()));
			
				C.setCellStyle(csText);
				//col2 Сумма размещенная  на начало отчетного периода, тенге 
				C = R.createCell(2);
				int p_Account_ID = DB.getSQLValue(get_TrxName(),"SELECT C_ElementValue_ID FROM C_ElementValue WHERE C_BankAccount_ID="+lineD.getC_BankAccount_ID());
				//
				BigDecimal beginSaldo = Env.ZERO;
				String beginSaldoSql = "SELECT COALESCE(SUM(AmtAcctDR - AmtAcctCR),0) FROM Fact_Acct WHERE DateAcct <'"+BeginPeriod+"' AND Account_ID = ?";
				//
//				System.out.println("beginSaldoSql: "+beginSaldoSql);
				//
				beginSaldo = DB.getSQLValueBD(get_TrxName(), beginSaldoSql, p_Account_ID);
				C.setCellValue(isThousand? beginSaldo.divide(new BigDecimal(1000)).doubleValue()
						:beginSaldo.doubleValue());
				C.setCellStyle(isThousand?csNumberTh:csNumber);
				//col3 Сумма размещенная  на конец отчетного периода, тенге 
				C = R.createCell(3);
				C.setCellFormula("C"+(rowNo+1)+"+F"+(rowNo+1));
				C.setCellStyle(isThousand?csNumberTh:csNumber);
				//col4 Установленные сублимиты
				C = R.createCell(4);
				C.setCellValue(isThousand?lineC.getEstablishSubLimit().divide(new BigDecimal(1000)).doubleValue()
						:lineC.getEstablishSubLimit().doubleValue());

				C.setCellStyle(isThousand?csNumberTh:csNumber);
				//col5 Изменение в сумме за период, тенге
				C = R.createCell(5);
				BigDecimal turnover = Env.ZERO;
				String turnoverSql = "SELECT COALESCE(SUM(AmtAcctDR - AmtAcctCR),0) FROM Fact_Acct WHERE DateAcct BETWEEN '"+BeginPeriod+"' AND '"+EndPeriod+"' AND Account_ID=?";
				turnover = DB.getSQLValueBD(get_TrxName(), turnoverSql, p_Account_ID);
				C.setCellValue(isThousand?turnover.divide(new BigDecimal(1000)).doubleValue()
						:turnover.doubleValue());
				C.setCellStyle(isThousand?csNumberTh:csNumber);
				
				//col6 Сумма первоначального размещения (тенге) 
				C = R.createCell(6);
				BigDecimal firstSum = new BigDecimal(0);
				firstSum = lineC.getContractSummary();
				C.setCellValue(isThousand?firstSum.divide(new BigDecimal(1000)).doubleValue():firstSum.doubleValue());
				C.setCellStyle(csNumber);
				
				//col7 Доля  от общей суммы ВСДС (%)
				C = R.createCell(7);
				C.setCellFormula("D"+(rowNo+1)+"/D"+(totalRowNo+1));
				C.setCellStyle(csPercent);
				
				//col8 Ставка (%)
				C = R.createCell(8);
				C.setCellValue((lineC.getrateremun().divide(new BigDecimal(100)).doubleValue()));
				C.setCellStyle(csPercent);
				
				//col9 Мес.
				C = R.createCell(9);
				C.setCellValue(lineC.getplacementperiod());
				C.setCellStyle(csText);
				
				//col10 Дата начала (дд.мм.гггг)
				C = R.createCell(10);
				C.setCellValue(lineC.getDateFrom());
				C.setCellStyle(csDate);
				
				//col11 Дата окончания (дд.мм.гггг)
				C = R.createCell(11);
				C.setCellValue(lineC.getA_Expired_Date());
				C.setCellStyle(csDate);
				
				//col12 Полученная сумма дохода за отчетный период
				C = R.createCell(12);
				BigDecimal premiumSum = Env.ZERO;
				String t_Sql = "SELECT COALESCE(SUM(f.AmtAcctDR),0) FROM Fact_Acct f,C_ElementValue e" 
						+"\nLEFT JOIN C_BankAccount ba ON e.C_BankAccount_ID = ba.C_BankAccount_ID"
						+"\nWHERE f.Account_ID = e.C_ElementValue_ID"
						+"\nAND f.PostingType='A' AND f.AD_Table_ID = 224" 
						+"\nAND f.Account_ID IN (SELECT C_ElementValue_ID FROM C_ElementValue WHERE C_BankAccount_ID = ?)"
						+"\nAND f.DateAcct BETWEEN '"+BeginPeriod+"' AND '"+EndPeriod+"'";
				premiumSum = DB.getSQLValueBD(get_TrxName(), t_Sql, lineD.getC_BankAccount_ID());
				C.setCellValue(isThousand?premiumSum.divide(new BigDecimal(1000)).doubleValue():premiumSum.doubleValue());
				C.setCellStyle(isThousand?csNumberTh:csNumber);
				
				//col13 Частичное изъятие
				C = R.createCell(13);
				C.setCellValue(lineC.isPartialWithdrawal()?Msg.translate(m_ctx, "Yes"):Msg.translate(m_ctx, "No"));
				C.setCellStyle(csText);
				
				//col14 Неснижаемый остаток
				C = R.createCell(14);
				C.setCellValue(isThousand?lineC.getMinBalance().divide(new BigDecimal(1000)).doubleValue()
							:lineC.getMinBalance().doubleValue());
				C.setCellStyle(csNumber);
				
				//col15 Выплата вознаграждений (ежемесячно/в конце срока) 
				C = R.createCell(15);
				C.setCellValue(lineC.getcms_paymenycompensationtype().getName());
				C.setCellStyle(csText);
				
				//col16 Сумма удержанного налога
				C = R.createCell(16); 
				BigDecimal taxAmtSum = Env.ZERO;
				String tax_Sql = "WITH CoorAcc AS(SELECT (SELECT cein.value FROM Fact_Acct fain" 
						+"\nINNER JOIN c_elementvalue cein ON cein.c_elementvalue_id = fain.account_id" 
						+"\nWHERE fain.AD_Table_ID = fa.AD_Table_ID  AND fain.Record_ID = fa.Record_ID" 
						+"\nAND fain.Counter = fa.Reference) accValue"  
						+"\n,sum(AmtAcctCr) cr"
						+"\nFROM Fact_Acct fa"
						+"\nWHERE fa.account_id = ?"
						+"\nAND DateAcct BETWEEN '"+BeginPeriod+"' AND '"+EndPeriod+"' AND fa.postingtype = 'A'" 
						+"\ngroup by accValue)"
						+"\nSELECT COALESCE(SUM(CR),0) FROM CoorAcc WHERE AccValue = '311000'";
				taxAmtSum = DB.getSQLValueBD(get_TrxName(), tax_Sql, p_Account_ID);
				C.setCellValue(isThousand?taxAmtSum.divide(new BigDecimal(1000)).doubleValue():taxAmtSum.doubleValue());
				C.setCellStyle(isThousand?csNumberTh:csNumber);
				
				//col17 Капитализация вознаграждений  (да/нет)
				C = R.createCell(17);
				C.setCellValue(lineC.isCapitalization()?Msg.translate(m_ctx, "Yes"):Msg.translate(m_ctx, "No"));
				C.setCellStyle(csText);
				
				lineD = null;
				rowNo++;
				nn++;
			}
		}
//------------------------------------------------------------------------------------------------		
//Всего депозиты-----------------------------------------------------------------------------------
		R = sheet.createRow(startRowNo);
		//col0 #
		R.createCell(0).setCellStyle(csText);
		//col1 Банк
		C = R.createCell(1);
		C.setCellValue("Всего депозиты");
		C.setCellStyle(csBText);
		//col2 Сумма размещенная  на начало отчетного периода, тенге 
		C = R.createCell(2);
		C.setCellFormula("SUM(C"+(startRowNo+2)+":C"+(rowNo)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col3 Сумма размещенная  на конец отчетного периода, тенге 
		C = R.createCell(3);
		C.setCellFormula("SUM(D"+(startRowNo+2)+":D"+(rowNo)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col4 Установленные сублимиты
		R.createCell(4).setCellStyle(csText);
		//col5 Изменение в сумме за период, тенге
		C = R.createCell(5);
		C.setCellFormula("SUM(F"+(startRowNo+2)+":F"+(rowNo)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col6 Сумма первоначального размещения (тенге) 
		R.createCell(6).setCellStyle(csText);
		//col7 Доля  от общей суммы ВСДС (%)
		C = R.createCell(7);
		C.setCellFormula("SUM(H"+(startRowNo+2)+":H"+(rowNo)+")");
		C.setCellStyle(csBPercent);
		//col8 Ставка (%)
		R.createCell(8).setCellStyle(csText);
		//col9 Мес.
		R.createCell(9).setCellStyle(csText);
		//col10 Дата начала (дд.мм.гггг)
		R.createCell(10).setCellStyle(csText);
		//col11 Дата окончания (дд.мм.гггг)
		R.createCell(11).setCellStyle(csText);
		//col12 Полученная сумма дохода за отчетный период
		C = R.createCell(12);
		C.setCellFormula("SUM(M"+(startRowNo+2)+":M"+(rowNo)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col13 Частичное изъятие
		R.createCell(13).setCellStyle(csText);
		//col14 Неснижаемый остаток
		R.createCell(14).setCellStyle(csText);
		//col15 Выплата вознаграждений (ежемесячно/в конце срока) 
		R.createCell(15).setCellStyle(csText);
		//col16 Сумма удержанного налога
		C = R.createCell(16);
		C.setCellFormula("SUM(Q"+(startRowNo+2)+":Q"+(rowNo)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col17 Капитализация вознаграждений  (да/нет)
		R.createCell(17).setCellStyle(csText);
//-----------------------------------------------------------------------------------------------		
//Текущие счета------------------------------------------------------------------------------
		int currCaushFirstRowNo = rowNo;
		nn = 0;
		for(Line line : currBankAccLines)
		{
			rowNo++;
			nn++;
			R = sheet.createRow(rowNo);
			//col0 №
			C = R.createCell(0);
			C.setCellValue(nn);
			C.setCellStyle(csText);
			//col1 Банк
			C = R.createCell(1);
			C.setCellValue(new MBank(m_ctx, line.getC_Bank_ID(), get_TrxName()).getName());
			
			//Добавление примечании на ячейку
			if(addComment)
				addComment(C, new MBankAccount(m_ctx, line.getC_BankAccount_ID(), get_TrxName()).getAccountNo());
			
			C.setCellStyle(csText);
			//col2 Сумма размещенная  на начало отчетного периода, тенге 
			C = R.createCell(2);
			C.setCellValue(isThousand? line.getBeginSaldo().divide(new BigDecimal(1000)).doubleValue()
					:line.getBeginSaldo().doubleValue()); 
			C.setCellStyle(csNumber);
			//col3 Сумма размещенная  на конец отчетного периода, тенге 
			C = R.createCell(3);
			C.setCellFormula("C"+(rowNo+1)+"+F"+(rowNo+1));
			C.setCellStyle(csNumber);
			//col4 Установленные сублимиты
			C = R.createCell(4);
			C.setCellStyle(csNumber);			
			//col5 Изменение в сумме за период, тенге
			C = R.createCell(5);
			C.setCellValue(isThousand?line.getTurnover().divide(new BigDecimal(1000)).doubleValue()
					:line.getTurnover().doubleValue());
			C.setCellStyle(csNumber);
			//col6 Сумма первоначального размещения (тенге) 
			C = R.createCell(6);
			C.setCellStyle(csNumber);
			//col7 Доля  от общей суммы ВСДС (%)
			C = R.createCell(7);
			C.setCellFormula("D"+(rowNo+1)+"/D"+(totalRowNo+1)); 
			C.setCellStyle(csPercent);
			//col8 Ставка (%)
			C = R.createCell(8);
			C.setCellStyle(csNumber);
			//col9  Мес.
			C = R.createCell(9);
			C.setCellStyle(csNumber);
			//col10 Дата начала (дд.мм.гггг)
			C = R.createCell(10);
			C.setCellStyle(csNumber);
			//col11 Дата окончания (дд.мм.гггг)
			C = R.createCell(11);
			C.setCellStyle(csNumber);
			//col12 Полученная сумма дохода за отчетный период
			C = R.createCell(12);
			C.setCellStyle(csNumber);
			//col13 Частичное изъятие
			C = R.createCell(13);
			C.setCellStyle(csNumber);
			//col14 Неснижаемый остаток
			C = R.createCell(14);
			C.setCellStyle(csNumber);
			//col15 Выплата вознаграждений (ежемесячно/в конце срока)
			C = R.createCell(15);
			C.setCellStyle(csNumber);
			//col16 Сумма удержанного налога
			C = R.createCell(16);
			C.setCellStyle(csNumber);
			//col17 Капитализация вознаграждений  (да/нет)
			C = R.createCell(17);
			C.setCellStyle(csNumber);
		}
//--------------------------------------------------------------------------------------------------		
//Всего текущие счета-------------------------------------------------------------------------------
		R = sheet.createRow(currCaushFirstRowNo);
		for(int i=0; i<=17; i++)
			R.createCell(i).setCellStyle(csText);
		//col1 
		C = R.getCell(1);
		C.setCellValue("Всего текущие счета");
		C.setCellStyle(csBText);
		//col2 Сумма размещенная  на начало отчетного периода, тенге 
		C = R.getCell(2);
		C.setCellFormula("SUM(C"+(currCaushFirstRowNo+2)+":C"+(rowNo+1)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col3 Сумма размещенная  на конец отчетного периода, тенге 
		C = R.getCell(3);
		C.setCellFormula("SUM(D"+(currCaushFirstRowNo+2)+":D"+(rowNo+1)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col5 Изменение в сумме за период, тенге
		C = R.getCell(5);
		C.setCellFormula("SUM(F"+(currCaushFirstRowNo+2)+":F"+(rowNo+1)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col7 Доля  от общей суммы ВСДС (%)
		C = R.getCell(7);
		C.setCellFormula("SUM(H"+(currCaushFirstRowNo+2)+":H"+(rowNo+1)+")");
		C.setCellStyle(csBPercent);
		//col12 Полученная сумма дохода за отчетный период
		C = R.getCell(12);
		C.setCellFormula("SUM(M"+(currCaushFirstRowNo+2)+":M"+(rowNo+1)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col16 Сумма удержанного налога
		C = R.getCell(16);
		C.setCellFormula("SUM(Q"+(currCaushFirstRowNo+2)+":Q"+(rowNo+1)+")");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
//----------------------------------------------------------------------------------------		
//Итого-----------------------------------------------------------------------------------
		rowNo++;
		R = sheet.createRow(rowNo);
		for(int i=0; i<=17;i++)
			R.createCell(i).setCellStyle(csText);
		//col1
		C = R.getCell(1);
		C.setCellValue("Итого");
		C.setCellStyle(csBText);
		//col2 Сумма размещенная  на начало отчетного периода, тенге
		C = R.getCell(2);
		C.setCellFormula("C"+(currCaushFirstRowNo+1)+"+C3");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col3 Сумма размещенная  на конец отчетного периода, тенге 
		C = R.getCell(3);
		C.setCellFormula("D"+(currCaushFirstRowNo+1)+"+D3");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col5 Изменение в сумме за период, тенге
		C = R.getCell(5);
		C.setCellFormula("F"+(currCaushFirstRowNo+1)+"+F3");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col7 Доля  от общей суммы ВСДС (%)
		C = R.getCell(7);
		C.setCellFormula("H"+(currCaushFirstRowNo+1)+"+H3");
		C.setCellStyle(csBPercent);
		//col12 Полученная сумма дохода за отчетный период
		C = R.getCell(12);
		C.setCellFormula("M"+(currCaushFirstRowNo+1)+"+M3");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
		//col16 Сумма удержанного налога
		C = R.getCell(16);
		C.setCellFormula("Q"+(currCaushFirstRowNo+1)+"+Q3");
		C.setCellStyle(isThousand?csBNumberTh:csBNumber);
//-----------------------------------------------------------------------------------					
//Delete temp styles-----------------------------------------------------------------
		R = sheet.getRow(0);
		for(int i = 19; i<=27; i++)
		{
			R.getCell(i).setCellStyle(R.getCell(29).getCellStyle());
			R.getCell(i).setCellValue("");
		}
		R.getCell(29).setCellValue("");
//-----------------------------------------------------------------------------------		
		// Write the output to a file
		FileOutputStream fileOut = new FileOutputStream(ResultPath);
		wb.write(fileOut);
		fileOut.close();
		// Open the file with the application associated
		Util.launchFile(new File(ResultPath));	
		return Msg.translate(m_ctx, "Success");
	}
	private void addComment(Cell cell, String commentText)
	{
		Drawing drawing = cell.getSheet().createDrawingPatriarch();
		CreationHelper factory = cell.getSheet().getWorkbook().getCreationHelper();
		RichTextString richTextString = factory.createRichTextString(commentText);
		
		ClientAnchor anchor = factory.createClientAnchor();
		anchor.setCol1(cell.getColumnIndex());
		anchor.setCol2(cell.getColumnIndex()+1);
		anchor.setRow1(cell.getRowIndex());
		anchor.setRow2(cell.getRowIndex()+commentText.length()/20);
		
		Comment comment = drawing.createCellComment(anchor);
		comment.setString(richTextString);
		cell.setCellComment(comment);
	}
	//Only for this report
	private Line[] getLines(String BankAccountType, Timestamp p_DateFrom, Timestamp p_DateTo)
	{
		Line line = null;
		List<Line> list = new ArrayList<Line>();
	    PreparedStatement pstmt = null;
		ResultSet rs = null;	
		try{
			pstmt = DB.prepareStatement(getSql(BankAccountType, p_DateFrom, p_DateTo), null);
			rs = pstmt.executeQuery();
			while(rs.next())
			{
				line = new Line(rs.getInt(1), rs.getInt(2), rs.getInt(3)
						, rs.getBigDecimal(4).setScale(0, BigDecimal.ROUND_HALF_UP)
						, rs.getBigDecimal(5).setScale(0, BigDecimal.ROUND_HALF_UP));
				list.add(line);
				line = null;
			}
		}
		catch (Exception e){}
		finally
		{
			DB.close(rs, pstmt);
			rs = null; pstmt = null;
		}
		return list.toArray(new Line[list.size()]);
	}
	
	private String getSql(String BankAccountType, Timestamp p_DateFrom, Timestamp p_DateTo)
	{
		String sql = "";
		sql = "WITH pMain AS" 
				+"\n(SELECT f.AD_Client_ID,f.Account_ID,ba.C_BankAccount_ID,ba.C_Bank_ID"
				+"\n,SUM(f.AmtAcctDR - f.AmtAcctCR) AS BeginSaldo,0::numeric AS Turnover "
				+"\nFROM Fact_Acct f,C_ElementValue e "
				+"\nLEFT JOIN C_BankAccount ba ON e.C_BankAccount_ID = ba.C_BankAccount_ID"
				+"\nINNER JOIN C_Bank b ON ba.C_Bank_ID = b.C_Bank_ID"
				+"\nWHERE f.Account_ID = e.C_ElementValue_ID"
				+"\nAND f.PostingType='A' "
				+"\nAND f.Account_ID IN (SELECT C_ElementValue_ID FROM C_ElementValue" 
				+"\nWHERE IsBankAccount='Y' AND C_BankAccount_ID IN"
				+"\n(SELECT C_BankAccount_ID FROM C_BankAccount WHERE BankAccountType='"+BankAccountType+"'))"
				+"\nAND f.DateAcct<'"+p_DateFrom+"'"
				+"\nGROUP BY f.AD_Client_ID,f.Account_ID,ba.C_BankAccount_ID,ba.C_Bank_ID"
				+"\nUNION ALL"
				+"\nSELECT f.AD_Client_ID,f.Account_ID,ba.C_BankAccount_ID,ba.C_Bank_ID"
				+"\n,0::numeric AS BeginSaldo,SUM(f.AmtAcctDR - f.AmtAcctCR) AS Turnover "
				+"\nFROM Fact_Acct f,C_ElementValue e "
				+"\nLEFT JOIN C_BankAccount ba ON e.C_BankAccount_ID = ba.C_BankAccount_ID"
				+"\nINNER JOIN C_Bank b ON ba.C_Bank_ID = b.C_Bank_ID"
				+"\nWHERE f.Account_ID = e.C_ElementValue_ID"
				+"\nAND f.PostingType='A' "
				+"\nAND f.Account_ID IN (SELECT C_ElementValue_ID FROM C_ElementValue" 
				+"\nWHERE IsBankAccount='Y' AND C_BankAccount_ID IN"
				+"\n(SELECT C_BankAccount_ID FROM C_BankAccount WHERE BankAccountType='"+BankAccountType+"'))"
				+"\nAND f.DateAcct BETWEEN '"+p_DateFrom+"' AND '"+p_DateTo+"'"
				+"\nGROUP BY f.AD_Client_ID,f.Account_ID,ba.C_BankAccount_ID,ba.C_Bank_ID)"
				+"\nSELECT Account_ID,C_BankAccount_ID,C_Bank_ID"
				+"\n,SUM(BeginSaldo) AS BeginSaldo, SUM(Turnover) AS Turnover"
				+"\nFROM pMain"
				+"\nWHERE AD_Client_ID = "+Env.getAD_Client_ID(Env.getCtx())+" AND (BeginSaldo<>0 OR Turnover<>0) ";
				if(BankAccountType.equals("S"))
				{
					sql = sql+" \nAND C_BankAccount_ID IN (SELECT C_BankAccount_ID FROM TRM_Deposit "
							 +"\nWHERE '"+p_DateFrom+"' BETWEEN BeginningDate  AND EndDate OR '\n"
							 + p_DateTo+"' BETWEEN BeginningDate AND EndDate)";
				}
				else
				{
					sql = sql +"\nAND C_BankAccount_ID!=1000019";
				}
					
		sql = sql+"\nGROUP BY Account_ID,C_BankAccount_ID,C_Bank_ID"
				+"\nORDER BY C_Bank_ID";
		return sql;
	}
	
	class Line
	{
		private int Account_ID = 0;
		private int C_BankAccount_ID = 0;
		private int C_Bank_ID = 0;
		private BigDecimal BeginSaldo = Env.ZERO;
		private BigDecimal Turnover = Env.ZERO;
		
		public Line(int account_ID, int c_BankAccount_ID, int c_Bank_ID, BigDecimal beginSaldo, BigDecimal turnover) 
		{
			super();
			Account_ID = account_ID;
			C_BankAccount_ID = c_BankAccount_ID;
			C_Bank_ID = c_Bank_ID;
			BeginSaldo = beginSaldo;
			Turnover = turnover;
		}
		
		public int getAccount_ID() 
		{
			return Account_ID;
		}
		public void setAccount_ID(int account_ID) 
		{
			Account_ID = account_ID;
		}
		public int getC_BankAccount_ID() 
		{
			return C_BankAccount_ID;
		}
		public void setC_BankAccount_ID(int c_BankAccount_ID) 
		{
			C_BankAccount_ID = c_BankAccount_ID;
		}
		public int getC_Bank_ID() 
		{
			return C_Bank_ID;
		}
		public void setC_Bank_ID(int c_Bank_ID) 
		{
			C_Bank_ID = c_Bank_ID;
		}
		public BigDecimal getBeginSaldo() 
		{
			return BeginSaldo;
		}
		public void setBeginSaldo(BigDecimal beginSaldo) 
		{
			BeginSaldo = beginSaldo;
		}
		public BigDecimal getTurnover() 
		{
			return Turnover;
		}
		public void setTurnover(BigDecimal turnover) 
		{
			Turnover = turnover;
		}
		
	} 

}
